﻿#include<iostream>
#include<vector>
using namespace std;

//【题目】力扣209.长度最小的子数组
//【难度】中等
//【提交】https://leetcode.cn/problems/minimum-size-subarray-sum/submissions/677233476/
//【标签】数组；二分查找；前缀和；滑动窗口
class Solution 
{
public:
    int minSubArrayLen(int target, vector<int>& nums) 
    {
        int n = nums.size(), ans = n + 1, sum = 0, left = 0;
        for (int right = 0; right < n; right++) 
        { // 枚举子数组右端点
            sum += nums[right];
            while (sum >= target) 
            { // 满足要求
                ans = min(ans, right - left + 1);
                sum -= nums[left];
                left++; // 左端点右移
            }
        }
        return ans <= n ? ans : 0;
    }
};
/*
学习总结：
使用滑动窗口（双指针） 技巧高效解决“长度最小的子数组”问题的优雅方法。其核心思路是
维护一个动态窗口 [left, right]，右指针 right 负责扩展窗口并累加和，当窗口和 sum 达到目标值时，
左指针 left 逐步右移以收缩窗口并更新最小长度。这种方法通过单次遍历即可解决问题，时间复杂度优化至 O(n)，
*/